package fabriques;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import donnees.Produit;


public class FabProduit {
	public static FabProduit fp;

	private static PreparedStatement pcreer;
	private static String creer = "insert into Produit values(?,?,?,?,?,?,?,?)";
	private static PreparedStatement prechercher;
	private static String rechercher = "select * from Produit where idProduit=?";
	private static PreparedStatement plister;
	private static String lister = "select * from Produit";
	private static PreparedStatement prechercherProduitsDeLaCategorie;
	private static String rechercherProduitsDeLaCategorie = "select * from Produit where idCategorie=?";
	private static PreparedStatement prechercherProduitDeLaLigne;
	private static String rechercherProduitDeLaLigne = "select Produit.* from Produit,LigneCommande where Produit.idProduit = LigneCommande.idProduit and idLigneCommande=?";
	
	public static synchronized FabProduit getInstance(){
		if(fp == null){
			fp = new FabProduit();
		}
		return fp;
	}

	public static void setConnection(Connection c){
		try {
			pcreer = c.prepareStatement(creer);
			prechercher = c.prepareStatement(rechercher);
			plister = c.prepareStatement(lister);
			prechercherProduitsDeLaCategorie=c.prepareStatement(rechercherProduitsDeLaCategorie);
			prechercherProduitDeLaLigne = c.prepareStatement(rechercherProduitDeLaLigne);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private FabProduit(){
		Connexion.getInstance();
		Connection con = Connexion.getCon();
		setConnection(con);
	}

	public Produit creer(int idProduit, String libelle, String description, float prix, int stock, int delaiES, int delaiHS, int idCateg){
		try{
			pcreer.setInt(1,idProduit);
			pcreer.setString(2,libelle);
			pcreer.setString(3,description);
			pcreer.setFloat(4,prix);
			pcreer.setInt(5,stock);
			pcreer.setInt(6,delaiES);
			pcreer.setInt(7,delaiHS);
			pcreer.setInt(8,idCateg);
			pcreer.executeUpdate();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return new Produit(idProduit,libelle,description,prix,stock,delaiES,delaiHS);
	}

	public Produit rechercher(int idProd) throws SQLException{
		ResultSet res = null;
		try {
			prechercher.setInt(1, idProd);
			res = prechercher.executeQuery();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		res.next();
		return new Produit(res.getInt(1), res.getString(2), res.getString(3), res.getFloat(4),res.getInt(5),res.getInt(6),res.getInt(7));
	}
	
	public ArrayList<Produit> rechercherProduitsDeLaCategorie(int id) {
		try{
			prechercherProduitsDeLaCategorie.setInt(1,id);
		}catch (SQLException e) {
			e.printStackTrace();
		}
		ResultSet res = null;
		try{
			res = prechercherProduitsDeLaCategorie.executeQuery();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		
		ArrayList<Produit> lesProds = new ArrayList<Produit>();
		try {
			while(res.next()){
				lesProds.add(rechercher(res.getInt(1)));
			}
			return lesProds;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	public Iterator<Produit> lister(){
		ResultSet res= null;
		try {
			res=plister.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		List<Produit> lesProd = new ArrayList<Produit>();
		try {
			while(res.next()){
				lesProd.add(rechercher(res.getInt(1)));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return lesProd.iterator();
	}
	
	public Produit rechercherProduitDeLaLigne(int id) {
		try{
			prechercherProduitDeLaLigne.setInt(1,id);
		}catch (SQLException e) {
			e.printStackTrace();
		}
		ResultSet res = null;
		try{
			res = prechercherProduitDeLaLigne.executeQuery();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		Produit tmp=null;
		try {
			if(res.next()){
				tmp=rechercher(res.getInt(1));
			}
			return tmp;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

}
